package com.tiger.cloud.common.tree;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;

/** 
 * 树形结构构建
 */  
public class EasyUiTreeNode implements Serializable {  
      
    private static final long serialVersionUID = 1L;  
    /** 
     * 节点ID 
     */  
    public String id;  
    /** 
     * 节点内容 
     */  
    public String text;  
    /** 
     * 父节点编号 
     */  
    public String parentId;  
    
    public String state="closed";
    /** 
     * 孩子节点列表 
     */  
    public List<EasyUiTreeNode> children = new ArrayList<EasyUiTreeNode>();  
      
    /** 
     * 添加子节点 
     *  
     * @param node 子节点 
     */  
    public void addChild(EasyUiTreeNode node) {  
        children.add(node);  
    } 
    
    public int childLen() {  
        return children.size();
    } 
      
    /** 
     * 说明方法描述：将list转为树tree结构 
     */  
    public static List<EasyUiTreeNode> tree(List<EasyUiTreeNode> allRrecords) {  
        List<EasyUiTreeNode> listParentTreeNode = new ArrayList<EasyUiTreeNode>();  
        List<EasyUiTreeNode> listNotParentTreeNode = new ArrayList<EasyUiTreeNode>();  
        // 第一步：遍历allRrecords保存所有数据的uuid用于判断是不是根节点  
        Map<String, String> mapAllUuid = new HashMap<String, String>();  
        Map<String, EasyUiTreeNode> allTreeNodeMap = new HashMap<String, EasyUiTreeNode>();  
        for (EasyUiTreeNode record : allRrecords) {  
            mapAllUuid.put(record.id, record.id);  
            allTreeNodeMap.put(record.id, record);  
        }  
        // 第二步：遍历allRrecords找出所有的根节点和非根节点  
        if (allRrecords != null && allRrecords.size() > 0) {  
            for (EasyUiTreeNode record : allRrecords) {  
                if (StringUtils.isBlank(record.parentId)  
                    || !mapAllUuid.containsKey(record.parentId)) {  
                    listParentTreeNode.add(record);  
                } else {  
                    listNotParentTreeNode.add(record);  
                }  
            }  
        }  
        // 第三步： 递归获取所有子节点  
        if (listParentTreeNode.size() > 0) {  
            for (EasyUiTreeNode record : listParentTreeNode) {  
                // 添加所有子级  
                record.children.addAll(getTreeChildTreeNode(listNotParentTreeNode, record.id));  
            }  
        }  
        return listParentTreeNode;  
    }  

    /** 
     * 说明方法描述：递归查询子节点 
     *  
     * @param childList 子节点 
     * @param parentUuid 父节点id 
     * @return 
     * @time 2016年5月10日 下午3:29:35 
     * @author yangdong 
     */  
    private static List<EasyUiTreeNode> getTreeChildTreeNode(List<EasyUiTreeNode> childList, String parentUuid) {  
        List<EasyUiTreeNode> listParentTreeNode = new ArrayList<EasyUiTreeNode>();  
        List<EasyUiTreeNode> listNotParentTreeNode = new ArrayList<EasyUiTreeNode>();  
        // 遍历tmpList，找出所有的根节点和非根节点  
        if (childList != null && childList.size() > 0) {  
            for (EasyUiTreeNode record : childList) {  
                // 对比找出父节点  
                if (StringUtils.equals(record.parentId, parentUuid)) {  
                    listParentTreeNode.add(record);  
                } else {  
                    listNotParentTreeNode.add(record);  
                }  
            }  
        }  
        // 查询子节点  
        if (listParentTreeNode.size() > 0) {  
            for (EasyUiTreeNode record : listParentTreeNode) {  
                // 递归查询子节点  
                record.children.addAll(getTreeChildTreeNode(listNotParentTreeNode, record.id));  
            }  
        }  
        return listParentTreeNode;  
    }  
  
}  